package edu.bw.interceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyHandlerInterceptor02 implements HandlerInterceptor {
    /**
     * preHandler特点:
     *   1.在控制方法执行之前调用
     *   2.按照拦截器定义顺序正向执行
     *   3.它是拦截链中最先执行的方法
     *   4.可以通过返回值决定请求是否继续执行下去
     *        如果返回true，请求继续传递即拦截器继续执行,对于单个拦截器来说,继续执行Hanlder
     *        如果返回false,
     * @param request
     * @param response
     * @param handler
     * @return    如果返回false,那么将不会执行Handler,返回true,才会放行执行Handler
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("...preHandler02执行...");
        return true;
//        return false;
    }


    /**
     * postHandler方法:
     *   1.在控制器方法执行完成后,视图渲染前调用
     *   2.按照拦截器定义的顺序逆向执行
     *   3.仅当所有拦截器‘preHandler’方法返回true且控制器方法执行成功(没有出现异常)才调用
     *      如果控制器中的方法出现异常,则不执行
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("...postHandler02....");
    }

    /**
     *
     * afterCompletion特点:
     *    1.在整个请求完成后(视图渲染结束)后调用
     *    2.按照拦截器定义的顺序逆向执行
     *    3，仅对拦截器的preHandler返回true后的拦截器调用
     *    4.无论控制器方法是否抛出异常都会执行(类似finally)
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("...afterComletion02...");
    }
}
